<?php

namespace app\api\controller;

class QQConnect
{

    /**
     * 获取QQconnect Login 跳转到的地址值
     * @return array 返回包含code state
     *
     **/
    public function login($app_id, $callback, $scope)
    {
        $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
        $login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
            . $app_id . "&redirect_uri=" . urlencode($callback)
            . "&state=" . session('state')
            . "&scope=" . urlencode($scope);
        //显示出登录地址
        header('Location:' . $login_url);
        exit();
    }

    /**
     * 获取access_token值
     * @return array 返回包含access_token,过期时间的数组
     * */
    private function get_token($app_id, $app_key, $code, $callback, $state)
    {
        if ($state !== session('state')) {
            return false;
            exit();
        }
        $url = "https://graph.qq.com/oauth2.0/token";
        $param = array(
            "grant_type" => "authorization_code",
            "client_id" => $app_id,
            "client_secret" => $app_key,
            "code" => $code,
            "state" => $state,
            "redirect_uri" => $callback

        );
        $response = $this->get_url($url, $param);
        if ($response == false) {
            return false;
        }
        $params = array();
        parse_str($response, $params);
        return $params["access_token"];

    }

    /**
     * 获取client_id 和 openid
     * @param string $access_token access_token验证码
     * @return array 返回包含 openid的数组
     * */

    private function get_openid($access_token)
    {

        $url = "https://graph.qq.com/oauth2.0/me";
        $param = array(
            "access_token" => $access_token
        );
        $response = $this->get_url($url, $param);
        if ($response == false) {
            return false;
        }
        if (strpos($response, "callback") !== false) {
            $lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response = substr($response, $lpos + 1, $rpos - $lpos - 1);
        }
        $user = json_decode($response);
        if (isset($user->error) || $user->openid == "") {
            return false;
        }
        return $user->openid;
    }
    /**
     * 获取用户信息
     * @param $app_id
     * @param $token
     * @param $openid
     * @return bool|mixed
     */
    public function get_user_info($app_id, $token, $openid)
    {

        $url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key=' . $app_id . '&access_token=' . $token . '&openid=' . $openid . '&format=json';
        $str = $this->get_url($url);
        if ($str == false) {
            return false;
        }
        $arr = json_decode($str, true);
        return $arr;
    }
    /**
     * 请求URL地址，返回callback得到返回字符串
     * @param $app_id
     * @param $app_key
     * @param $callback
     * @return array|bool
     */
    public function callback($app_id, $app_key, $callback)
    {
        $code = request()->param('code');
        $state = request()->param('state');
        $token = $this->get_token($app_id, $app_key, $code, $callback, $state);
        $openid = $this->get_openid($token);
        if (!$token || !$openid) {
            return false;
            exit();
        }
        return array('openid' => $openid, 'token' => $token);

    }

    /*
     * HTTP GET Request
    */
    private function get_url($url, $param = null)
    {
        if ($param != null) {
            $query = http_build_query($param);
            $url = $url . '?' . $query;
        }
        $ch = curl_init();
        if (stripos($url, "https://") !== false) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $content = curl_exec($ch);
        $status = curl_getinfo($ch);
        curl_close($ch);
        if (intval($status["http_code"]) == 200) {
            return $content;
        } else {
            echo $status["http_code"];
            return false;
        }
    }
    /*
     * HTTP POST Request
    */
    private function post_url($url, $params)
    {
        $ch = curl_init();
        if (stripos($url, "https://") !== false) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        $content = curl_exec($ch);
        $status = curl_getinfo($ch);
        curl_close($ch);
        if (intval($status["http_code"]) == 200) {
            return $content;
        } else {
            return false;
        }
    }
}